// const xhr = new XMLHttpRequest()
// xhr.open('GET', '/data/test.json', true)
// xhr.onreadystatechange = function () {
//     if (xhr.readyState === 4) {
//         if (xhr.status === 200) {
//             // console.log(
//             //     JSON.parse(xhr.responseText)
//             // )
//             alert(xhr.responseText)
//         } else if (xhr.status === 404) {
//             console.log('404 not found')
//         }
//     }
// }
// xhr.send(null)
/** 错误处理 https://zh.javascript.info/promise-error-handling */
/**
 * 1.直接用Promise.reject('')  没有返回的话，就相当于执行 promise.resolve()  除非用 return Promise.reject()  reject就会起作用，然后后面的catch和reject 起作用
 * 2. throw Error 和 return Promise.reject() 等价。
 *  结合请求处理看。
 */
function ajax(url) {
  const p = new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.onreadystatechange = function () {
      debugger;
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          resolve(JSON.parse(xhr.responseText));
        } else if (xhr.status === 404 || xhr.status === 500) {
          reject(new Error("404 not found"));
        }
      }
      reject(new Error("出现错误"));
    };
    xhr.send(null);
  });
  return p;
}

const url = "/data/test.json";
/*** 当reject 返回错误的时候，执行的then de 异常回调就表示错误处理了。后面的reject 就不会执行 */
ajax(url)
  //   .catch((err) => {
  //     debugger;
  //     console.log(err);
  //   })
  .then(
    (res) => console.log(res),
    (err) => {
      /** 直接执行相当于执行 Promise.resolve(undefined) */
      Promise.reject("reject", err);
      console.log("reject", err);
      debugger;
      //   用return 相当于执行Promise.resolve(undefine) 然后返回一个promise，后面的then 就会执行，如果用reject 就会执行上面描述 的一套
      return Promise.reject(new Error("新错误"));
      //   直接出现错误的话，就执行Promise.reject(undefined)
      //   new Error("直接出现错误");

      //   直接抛出错误,相当于执行promise.resolve(new Error()),可以捕获错误和reject(new Error())
      // throw new Error("直接抛出错误");
    }
  )
  .catch((err) => {
    debugger;
    console.log("err123", err.toString());
    return Promise.reject("reject ");
    // 后面相当于执行了resolve（undefined）
  })
  .then(
    (res) => {
      debugger;
      console.log("last", res);
      throw new Error("抛出错误延迟处理");
    },
    (error) => {
      console.log("接受错误", error);
      // throw new Error("抛出错误延迟处理");
      debugger;
      return Promise.reject("拒收");
    }
  )
  .then((res) => {
    console.log("1", res);
  })
  .then((res) => {
    console.log("2", res);
  })
  .catch((error) => {
    debugger;
    console.log("延迟接受错误", error);
  });
